home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Oberon / AutoJoin.mod < prev    next >
Text File  |  1996-07-06  |  7KB  |  302 lines

  1. MODULE AutoJoin;
  2.  
  3.     IMPORT
  4.     a:= Arguments, ac:= ANSIConsole, st:= Strings, cv:= Conversions, io, s:= SYSTEM,
  5.     e:= Exec, d:= Dos, ol:= OberonLib,
  6.     bo:= BBSColours, bs:= BBSStructures, bc:= BBSConstants,
  7.     hn:= HBBSNode, hc:= HBBSCommon, req:= Requests;
  8.  
  9.  
  10.     CONST EOF = -1; LF = 0AH;
  11.       LineLength = 80;
  12.       LTRUE = 1; LFALSE = 0;
  13.  
  14.     TYPE
  15.     LineNodePtr = UNTRACED POINTER TO LineNode;
  16.     LineNode = STRUCT
  17.         prev, next: LineNodePtr;
  18.         text: ARRAY LineLength OF CHAR;
  19.     END;
  20.  
  21.     VAR
  22.     BBSGlobal: bs.BBSGlobalDataPtr;
  23.     NnD: bs.NodeDataPtr;
  24.     NodeNum: LONGINT;
  25.     sLine: ARRAY 80 OF CHAR;
  26.     argList: LineNodePtr;
  27.     CountArgs: INTEGER;
  28.     file: d.FileHandlePtr;
  29.     textPool: e.MemPoolPtr;
  30.     menuName: LineNodePtr;
  31.  
  32.     PROCEDURE cleanup(num: LONGINT);
  33.     BEGIN
  34.     IF hn.HBBSNodeBase # NIL THEN
  35.         hn.HBBSCleanUpDoor;
  36.         e.CloseLibrary(hn.HBBSNodeBase);
  37.         hn.HBBSNodeBase:= NIL;
  38.     END;
  39.     IF hc.HBBSCommonBase # NIL THEN
  40.         hc.HBBSCleanUpCommon;
  41.         e.CloseLibrary(hc.HBBSCommonBase);
  42.         hc.HBBSCommonBase:= NIL;
  43.     END;
  44.  
  45.     IF num # 0 THEN
  46.         io.WriteString("Door Error = ");
  47.         io.WriteInt(num, 0); io.WriteLn;
  48.          (* io.Format("Door Error = %d\n", s.ADR(num)) *)
  49.     END;
  50.     END cleanup;
  51.  
  52.     PROCEDURE init(name: e.STRPTR);
  53.     BEGIN
  54.     
  55.     IF hc.HBBSCommonBase = NIL THEN
  56.         cleanup(1); RETURN
  57.     END;
  58.     IF NOT hc.HBBSInitCommon() THEN
  59.         cleanup(2); RETURN
  60.     END;
  61.  
  62.     IF hn.HBBSNodeBase = NIL THEN
  63.         cleanup(3); RETURN
  64.     END;
  65.  
  66.     IF NOT hn.HBBSInitDoor(SHORT(NodeNum), name) THEN
  67.         cleanup(4); RETURN
  68.     END;
  69.  
  70.     END init;
  71.  
  72.     PROCEDURE AddNode(VAR list: LineNodePtr; at: INTEGER): LineNodePtr;
  73.     VAR last, new: LineNodePtr;
  74.         dummy: LineNode;
  75.     BEGIN
  76.     new:= e.AllocPooled(textPool, s.SIZE(dummy));
  77.     IF list = NIL THEN
  78.         IF new # NIL THEN
  79.         new^.prev:= NIL;
  80.         new^.next:= NIL;
  81.         END;
  82.         list:= new;
  83.     ELSE
  84.         IF at <= 1 THEN
  85.         IF new # NIL THEN
  86.             new^.prev:= NIL;
  87.             new^.next:= list;
  88.             list^.prev:= new;
  89.             list:= new;
  90.         END;
  91.         ELSE
  92.         last:= list;
  93.         WHILE (last^.next # NIL) & (at > 2) DO
  94.             last:= last^.next; at:= at - 1
  95.         END;
  96.         IF new # NIL THEN
  97.             new^.next:= last^.next;
  98.             new^.prev:= last;
  99.             IF last^.next # NIL THEN
  100.             last^.next^.prev:= new
  101.             END;
  102.             last^.next:= new;
  103.         END;
  104.         END;
  105.     END;
  106.     RETURN new;
  107.     END AddNode;
  108.  
  109.     PROCEDURE DeleteNode(VAR list: LineNodePtr; at: INTEGER);
  110.     VAR this: LineNodePtr;
  111.         dummy: LineNode;
  112.     BEGIN
  113.     IF list # NIL THEN
  114.         this:= list;
  115.         IF at <= 1 THEN
  116.         list:= this^.next;
  117.         IF list # NIL THEN list^.prev:= NIL END;
  118.         ELSE
  119.         WHILE (this^.next # NIL) & (at > 1) DO
  120.             this:= this^.next; at:= at - 1
  121.         END;
  122.         IF this^.prev # NIL THEN
  123.             this^.prev^.next:= this^.next
  124.         END;
  125.         IF this^.next # NIL THEN
  126.             this^.next^.prev:= this^.prev;
  127.         END;
  128.         END;
  129.         e.FreePooled(textPool, this, s.SIZE(dummy));
  130.     END;
  131.     END DeleteNode;
  132.  
  133.     PROCEDURE GetNode(list: LineNodePtr; at: INTEGER): LineNodePtr;
  134.     BEGIN
  135.     IF list = NIL THEN RETURN NIL END;
  136.     WHILE (list # NIL) & (at > 1) DO
  137.         list:= list^.next; at:= at - 1;
  138.     END;
  139.     RETURN list;
  140.     END GetNode;
  141.  
  142.     PROCEDURE ReqNumber(l: LONGINT);
  143.     VAR str: ARRAY 80 OF CHAR;
  144.         ok: BOOLEAN;
  145.         count: INTEGER; factor: LONGINT;
  146.     BEGIN
  147.     factor:= 1000000000; count:= 10;
  148.     WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
  149.     ok:= cv.IntToString(l, str, count);
  150.     IF ok THEN
  151.         req.BreakPoint(str)
  152.     END;
  153.     END ReqNumber;
  154.  
  155.     VAR str: ARRAY 80 OF CHAR;
  156.  
  157.     PROCEDURE PutNumber(l: LONGINT);
  158.     VAR ok: BOOLEAN;
  159.         count: INTEGER; factor: LONGINT;
  160.     BEGIN
  161.     factor:= 1000000000; count:= 10;
  162.     WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
  163.     ok:= cv.IntToString(l, str, count);
  164.     IF ok THEN
  165.         hn.DOORWriteText(s.ADR(str));
  166.     END;
  167.     END PutNumber;
  168.  
  169.     VAR str1: ARRAY 2 OF CHAR;
  170.  
  171.     PROCEDURE PutChar(ch: CHAR);
  172.     BEGIN
  173.     str1[0]:= ch; str1[1]:= CHR(0);
  174.     hn.DOORWriteText(s.ADR(str));
  175.     END PutChar;
  176.  
  177.     PROCEDURE ReplyArgs;
  178.     VAR
  179.         i: INTEGER;
  180.         thisArg: LineNodePtr;
  181.     BEGIN
  182.     i:= 1;
  183.     LOOP
  184.         thisArg:= GetNode(argList, i);
  185.         IF thisArg # NIL THEN hn.DOORWriteText(s.ADR(thisArg^.text)) END; 
  186.         hn.DOORWriteText(s.ADR(" "));
  187.         IF thisArg = NIL THEN EXIT END;
  188.         i:= i + 1
  189.     END;
  190.     END ReplyArgs;
  191.  
  192.     PROCEDURE AllowAccess(ConfNum: LONGINT): BOOLEAN;
  193.     VAR tmpConf: bs.ConfDataPtr;
  194.         tmpBoolNode: bs.BoolNodePtr;
  195.     BEGIN
  196.     IF (ConfNum > 0) & (ConfNum <= BBSGlobal^.Conferences) THEN
  197.         tmpConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) -1);
  198.         IF tmpConf^.ConfAccess > NnD^.User.CallData.Access THEN
  199.         RETURN FALSE
  200.         ELSE
  201.         tmpBoolNode:= hc.GetNode(NnD^.User.ConfAcs.Access, SHORT(ConfNum) -1);
  202.         RETURN tmpBoolNode^.Boolean = bc.LTRUE;
  203.         END;
  204.     ELSE
  205.         RETURN FALSE;
  206.     END;
  207.     END AllowAccess;
  208.  
  209.     PROCEDURE DoorMain;
  210.     VAR
  211.         ConfNum: LONGINT;
  212.     BEGIN
  213.     (* ReplyArgs; *)
  214.     IF cv.StringToInt(NnD^.ActiveDoor^.SystemOptions^, ConfNum) THEN
  215.         IF AllowAccess(ConfNum) THEN
  216.         NnD^.CurrentConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) - 1);
  217.         NnD^.User.NormalData.LastConf:= ConfNum;
  218.         NnD^.User.CallData.LastConf:= ConfNum;
  219.         NnD^.MaxDIZLines:= NnD^.CurrentConf^.MaxDIZLines;;
  220.         hn.HBBSSetAccess;
  221.         hn.HBBSSetBBSCols;
  222.         hn.DOORWriteText(s.ADR(""));
  223.         ELSE
  224.         IF hn.DOORPausePrompt(s.ADR("Access denied...press any key")) = bc.LTRUE THEN END;
  225.         END;
  226.     ELSIF st.Occurs(NnD^.ActiveDoor^.SystemOptions^,"PREFS") >= 0 THEN
  227.         ConfNum:= NnD^.User.NormalData.PreferedConf;
  228.         IF ConfNum > 0 THEN
  229.         IF AllowAccess(ConfNum) THEN
  230.             NnD^.CurrentConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) - 1);
  231.             NnD^.User.NormalData.LastConf:= ConfNum;
  232.             NnD^.User.CallData.LastConf:= ConfNum;
  233.             NnD^.MaxDIZLines:= NnD^.CurrentConf^.MaxDIZLines;
  234.             hn.HBBSSetAccess;
  235.             hn.HBBSSetBBSCols;
  236.         ELSE
  237.             IF hn.DOORPausePrompt(s.ADR("Prefered conf is not valide, access denied"))= bc.LTRUE THEN END;
  238.         END;
  239.         END;
  240.         hn.DOORWriteText(s.ADR(""));
  241.     ELSE
  242.         hn.DOORWriteText(s.ADR("Conference Number #"));
  243.         hn.DOORWriteText(NnD^.ActiveDoor^.SystemOptions);
  244.         hn.DOORWriteText(s.ADR(" Does'nt exist..."));
  245.         IF hn.DOORPausePrompt(s.ADR("press any key")) = bc.LTRUE THEN END;
  246.     END;
  247.     END DoorMain;
  248.  
  249.     PROCEDURE ParseArgs;
  250.     VAR
  251.         i: INTEGER;
  252.         newArg: LineNodePtr;
  253.         s: ARRAY 80 OF CHAR;
  254.         ok: BOOLEAN;
  255.     BEGIN
  256.     CountArgs:= a.NumArgs();
  257.     i:= 1;
  258.     WHILE i <= CountArgs DO
  259.         newArg:= AddNode(argList, MAX(INTEGER));
  260.         IF newArg # NIL THEN
  261.         a.GetArg(i, newArg^.text);
  262.         ELSE
  263.         CountArgs:= i;
  264.         END;
  265.         i:= i + 1
  266.     END;
  267.     END ParseArgs;
  268.  
  269.  
  270.     VAR
  271.     newArg: LineNodePtr;
  272.     dummy: LineNode;
  273.  
  274. BEGIN
  275.     textPool:= e.CreatePool(LONGSET{}, s.SIZE(dummy), s.SIZE(dummy));
  276.     ParseArgs;
  277.     IF CountArgs > 0 THEN
  278.      newArg:= GetNode(argList, 1);
  279.      IF cv.StringToInt(newArg^.text, NodeNum) THEN
  280.         init(s.ADR("Auto-join Conference"));
  281.         IF hc.HBBSCommonBase # NIL THEN
  282.         BBSGlobal:= hc.HBBSGimmeBBS();
  283.         IF BBSGlobal # NIL THEN
  284.             NnD:= hc.HBBSNodeDataPtr(SHORT(NodeNum));
  285.             IF NnD # NIL THEN
  286.             DoorMain;
  287.             END;
  288.         END;
  289.         END;
  290.         cleanup(0);
  291.     ELSE
  292.         io.WriteString("Invalid Param for door!\n")
  293.     END;
  294.     ELSE
  295.     io.WriteString("No Param for door!\n");
  296.     END;
  297. CLOSE
  298.     cleanup(0);
  299.     e.DeletePool(textPool);
  300. END AutoJoin.
  301.  
  302.